package View;

import Componenten.LocalTypes;
import Componenten.SpriteSheet;
import java.awt.Image;

/**
 * Klasse voor het ophalen van de afbeeldingen op het speelbord
 * @author Bram Slob en Roderick van Seijen
 */
public class ObjectView implements LocalTypes {
    private SpriteSheet spelerSprite;
    private SpriteSheet muurSprite;
    private SpriteSheet doosSprite;
    private SpriteSheet legeDoosSprite;
    private SpriteSheet volleDoosSprite;
    private SpriteSheet vakSprite;
    private SpriteSheet hulpstukSprite;
    
    /**
     * Constructor voor ObjectView
     */
    public ObjectView(){
        int vakGrootte = BordView.getVakGrootte();
        spelerSprite = new SpriteSheet(vakGrootte, vakGrootte, 4, 9, "/Resources/speler_sprite.png");
        muurSprite = new SpriteSheet(vakGrootte, vakGrootte, 1, 1, "/Resources/muur_sprite.png");
        doosSprite = new SpriteSheet(vakGrootte, vakGrootte, 1, 2, "/Resources/doos_sprite.png");
        volleDoosSprite = new SpriteSheet(vakGrootte, vakGrootte, 1, 2, "/Resources/volle_doos_sprite.png");
        legeDoosSprite = new SpriteSheet(vakGrootte, vakGrootte, 1, 2, "/Resources/lege_doos_sprite.png");
        vakSprite = new SpriteSheet(vakGrootte, vakGrootte, 1, 2, "/Resources/vak_sprite.png");
        hulpstukSprite = new SpriteSheet(vakGrootte, vakGrootte, 1, 1, "/Resources/hulpstuk_sprite.png");
    }
    
    /**
     * Converteer een Richting type naar een integer type (voor gebruik met de imagesprites).
     * @param r Richting die omgezet dient te worden
     * @return  Numerieke representatie van de betreffende richting
     */
    private int richtingToInt(Richting r){
        int ret = 2;
        if (r != null) {
            switch (r) {
                case NOORD:
                    ret = 0;
                    break;
                case WEST:
                    ret = 1;
                    break;
                case ZUID:
                    ret = 2;
                    break;
                case OOST:
                    ret = 3;
                    break;
            }
        }
        
        return ret;
    }
    
    /**
     * Geef de afbeelding van de speler (afhankelijk van richting en moment in een beweging)
     * @param r         Richting die de speler uitkijkt/-loopt.
     * @param stappen   aantal ministappen die de speler gemaakt heeft in de betreffende richting.
     * @return  Afbeelding van de speler op het huidige moment
     */
    private Image getSpelerImage(Richting r, int stappen){
        return spelerSprite.getImage(richtingToInt(r),stappen);
    }
    
    /**
     * @return  Afbeelding van een muur
     */
    private Image getMuurImage(){
        return muurSprite.getImage(0,0);
    }
    
    /**
     * Geef de afbeelding van een doos (afhankelijk van het type vak waar de doos op staat)
     * @param vakType Type van het vak waar de doos op staat (eind / normaal)
     * @return  Afbeelding van de doos op het huidige moment
     */
    private Image getDoosImage(VakType vakType){
        Image img = null;
        switch (vakType) {
            case NORMAAL:
                img = doosSprite.getImage(0,0);
                break;
            case EIND:
                img = doosSprite.getImage(0,1);
                break;
        }
        return img;
    }
    
    /**
     * Geef de afbeelding van een lege doos (afhankelijk van het type vak waar de lege doos op staat)
     * @param vakType Type van het vak waar de lege doos op staat (eind / normaal)
     * @return  Afbeelding van de lege doos op het huidige moment
     */
    private Image getLegeDoosImage(VakType vakType){
        Image img = null;
        switch (vakType) {
            case NORMAAL:
                img = legeDoosSprite.getImage(0,0);
                break;
            case EIND:
                img = legeDoosSprite.getImage(0,1);
                break;
        }
        return img;
    }
    
    /**
     * Geef de afbeelding van een volle doos (afhankelijk van het type vak waar de volle doos op staat)
     * @param vakType Type van het vak waar de volle doos op staat (eind / normaal)
     * @return  Afbeelding van de volle doos op het huidige moment
     */
    private Image getVolleDoosImage(VakType vakType){
        Image img = null;
        switch (vakType) {
            case NORMAAL:
                img = volleDoosSprite.getImage(0,0);
                break;
            case EIND:
                img = volleDoosSprite.getImage(0,1);
                break;
        }
        return img;
    }
    
    /**
     * Geef de afbeelding van een hulpstuk (afhankelijk van het type vak waar het hulpstuk op staat)
     * @param vakType Type van het vak waar het hulpstuk op staat (eind / normaal)
     * @return  Afbeelding van het hulpstuk op het huidige moment
     */
    private Image getHulpstukImage(){
        Image img = hulpstukSprite.getImage(0,0);
        return img;
    }
    
    /**
     * Geef de afbeelding van een vak (afhankelijk van het type vak)
     * @param vakType Type van het vak (eind / normaal / buiten)
     * @return  Afbeelding van het betreffende vak
     */
    public Image getVakImage(VakType vakType){
        Image img = null;
        switch (vakType) {
            case NORMAAL:
                img = vakSprite.getImage(0,0);
                break;
            case EIND:
                img = vakSprite.getImage(0,1);
                break;
        }
        return img;
    }
    
    /**
     * Geef de afbeelding van een element (afhankelijk van de meegegeven parameters)
     * @param elType    type element (doos, speler, muur)
     * @param vakType   type vak (normaal, eind)
     * @param r         richting van de beweging (alleen relevant voor speler)
     * @param stappen   aantal ministappen die de speler gemaakt heeft in de richting van het buurvak
     * @return  afbeelding van het betreffende element (op het huidige moment)
     */
    public Image getElementImage(ElementType elType, VakType vakType, Richting r, int stappen){
        Image img = null;
        if(elType != null){
            switch (elType) {
                case MUUR:
                    img = getMuurImage();
                    break;
                case LEGE_DOOS:
                    img = getLegeDoosImage(vakType);
                    break;
                case DOOS:
                    img = getDoosImage(vakType);
                    break;
                case VOLLE_DOOS:
                    img = getVolleDoosImage(vakType);
                    break;
                case HULPSTUK:
                    img = getHulpstukImage();
                    break;
                case SPELER:
                    img = getSpelerImage(r, stappen);
                    break;
            }
        }
        return img;
    }
}
